小程序学习:八皇后问题
八皇后问题:
要求:在8 x 8的棋盘上,放置8个皇后,要求不能有2个皇后在同一行、同一列和同一斜线。
输出:解的个数及所有解。
方法:
回溯法,有递归和非递归两种,个人更喜欢非递归方法。以下C代码可以直接编译运行。
非递归版:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define N 8 4 5 int num = 0; 6 int p[N]; 7 8 int check(int k) 9 { 10 int i; 11 for(i = 0; i < k; ++i){ 12 if(p[i] == p[k] || (abs(p[k] - p[i]) == k - i)) 13 return 0; 14 } 15 return 1; 16 } 17 18 void print_result(num) 19 { 20 int i; 21 printf("第%d种方案:", num); 22 for(i = 0; i < N; ++i) 23 printf("%d ", p[i] + 1); 24 printf("\n"); 25 } 26 27 void queen() 28 { 29 int k = 0; 30 while(k >= 0){ 31 ++p[k]; 32 if(p[k] < N && !check(k)) 33 continue; 34 if(p[k] == N){ 35 p[k] = -1; 36 --k; 37 continue; 38 } 39 if(k == N - 1){ 40 ++num; 41 print_result(num); 42 } 43 else 44 ++k; 45 } 46 } 47 48 int main() 49 { 50 int i; 51 for(i = 0; i < N; ++i) 52 p[i] = -1; 53 queen(); 54 printf("八皇后问题共有%d种解法\n", num); 55 }
递归版:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define N 8 5 6 int num = 0; 7 int p[N]; 8 9 int check(int k) 10 { 11 int i; 12 for(i = 0; i < k; ++i){ 13 if(p[i] == p[k] || (abs(p[k] - p[i]) == k - i)) 14 return 0; 15 } 16 return 1; 17 } 18 19 void print_result(int num) 20 { 21 int i; 22 printf("第%d种方案:", num); 23 for(i = 0; i < N; ++i) 24 printf("%d ", p[i] + 1); 25 printf("\n"); 26 } 27 28 void queen(int k) 29 { 30 int i; 31 if(k == N){ 32 ++num; 33 print_result(num); 34 } 35 for(i = 0; i < N; ++i){ 36 p[k] = i; 37 if(!check(k)) 38 continue; 39 queen(k+1); 40 } 41 } 42 43 int main() 44 { 45 queen(0); 46 printf("八皇后问题共有%d种解法\n", num); 47 }